package br.com.scpe.ejb.sessionBean;

import java.util.List;

import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.NoResultException;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

import br.com.scpe.ejb.entity.Funcionario;
import br.com.scpe.ejb.entity.FuncionarioProjeto;
import br.com.scpe.ejb.entity.Projeto;

@Stateless
public class ProjetoSessionBean {

	@PersistenceContext
	private EntityManager entityManager;

	public void incluirProjeto(Projeto projeto) {
		projeto.setIdProjeto(0);
		this.entityManager.persist(projeto);
	}

	public void altearProjeto(Projeto projeto) {
		projeto.setNomeProjeto(projeto.getNomeProjeto().toUpperCase());
		this.entityManager.merge(projeto);
	}

	public void excluirProjeto(Projeto projeto) {
		Projeto projetoExcluir = new Projeto();
		projetoExcluir = this.entityManager.find(Projeto.class, projeto.getIdProjeto());
		this.entityManager.remove(projetoExcluir);
	}
	
	public void vincularFuncionario(FuncionarioProjeto funcionarioProjeto){
		this.entityManager.merge(funcionarioProjeto);
	}

	public void desvincularFuncionario(FuncionarioProjeto funcionarioProjeto){
	
		FuncionarioProjeto projeto = new FuncionarioProjeto();
		projeto = this.entityManager.find(FuncionarioProjeto.class, funcionarioProjeto.getPk());
			if (!(projeto == null)) {
				this.entityManager.remove(projeto);
	}
	
}

	@SuppressWarnings("unchecked")
	public List<Projeto> consultaTodosProjetos() {
		Query query = entityManager.createNamedQuery("Projeto.consultarTodosProjetos");
		try {
			return query.getResultList();
		} catch (NoResultException e) {
			return null;
		}
	}

	public Projeto consultaProjetoPorNome(String nomeProjeto) {
		Query query = entityManager.createNamedQuery("Projeto.consultarProjetoPorNome");
		query.setParameter("nomeProjeto", nomeProjeto);
		try {
			return (Projeto) query.getSingleResult();
		} catch (NoResultException e) {
			return null;
		}
	}

	@SuppressWarnings("unchecked")
	public List<Projeto> consultaProjetoPorNomeComplete(String digitado) {
		Query query = entityManager.createNamedQuery("Projeto.consultarProjetoPorNomeComplete");
		query.setParameter("digitado", digitado + "%");
		try {
			return query.getResultList();
		} catch (NoResultException e) {
			return null;
		}
	}

	@SuppressWarnings("unchecked")
	public List<Funcionario> consultaFuncionarioSemProjeto(Long idProjeto) {
		Query query = entityManager.createNamedQuery("Projeto.consultarProjetoPorFuncionario");
		query.setParameter("idProjeto", idProjeto);
		try {
			return query.getResultList();
		} catch (NoResultException e) {
			return null;
		}
	}

	public Projeto consultaProjetoPorIdProjeto(Long idProjeto) {
		Query query = entityManager.createNamedQuery("Projeto.consultaProjetoPorIdProjeto");
		query.setParameter("idProjeto", idProjeto);
		try {
			return (Projeto) query.getSingleResult();
		} catch (NoResultException e) {
			return null;
		}
	}

	@SuppressWarnings("unchecked")
	public List<Projeto> consultaProjetoPorIdProjetoLista(Long idProjeto) {
		Query query = entityManager.createNamedQuery("Projeto.consultaProjetoPorIdProjeto");
		query.setParameter("idProjeto", idProjeto);
		try {
			return (List<Projeto>) query.getResultList();
		} catch (NoResultException e) {
			return null;
		}
	}

	@SuppressWarnings("unchecked")
	public List<Projeto> consultarProjetosFuncionarios(Long idFuncionario) {
		Query query = entityManager.createNamedQuery("Projeto.consultaProjetoFuncionario");
		query.setParameter("idFuncionario", idFuncionario);
		try {
			return query.getResultList();
		} catch (NoResultException e) {
			return null;
		}
	}

	@SuppressWarnings("unchecked")
	public List<Projeto> consultarProjetosFuncionariosProjeto(Long idFuncionario) {
		Query query = entityManager.createNamedQuery("Projeto.consultaProjetoFuncionario");
		query.setParameter("idFuncionario", idFuncionario);
		try {
			return query.getResultList();
		} catch (NoResultException e) {
			return null;
		}
	}

	@SuppressWarnings("unchecked")
	public List<FuncionarioProjeto> consultarProjetosFuncionariosProjetoFP(Long idFuncionario) {
		Query query = entityManager.createNamedQuery("Projeto.consultaProjetoFuncionario");
		query.setParameter("idFuncionario", idFuncionario);
		try {
			return query.getResultList();
		} catch (NoResultException e) {
			return null;
		}
	}

	@SuppressWarnings("unchecked")
	public List<FuncionarioProjeto> consultaFuncionarioProjeto() {
		Query query = entityManager.createNamedQuery("Projeto.consultaFuncionarioProjeto");
		try {
			return query.getResultList();
		} catch (NoResultException e) {
			return null;
		}
	}
	
	@SuppressWarnings("unchecked")
	public List<Projeto> consultaProjetosFuncionarioMesAno(Long idFuncionario, Long mes, Long ano){
		Query query = entityManager.createQuery("select p from Projeto p, Ponto a, where p.idProjeto in (select t.pk.idProjeto from FuncionarioProjeto t where t.pk.idFuncionario = :idFuncionario) and MONTH(a.horaEntrada) = :mes and year(a.horaEntrada) = :ano");
		query.setParameter("idFuncionario", idFuncionario);
		query.setParameter("mes", Integer.parseInt(String.valueOf(mes)));
		query.setParameter("ano", Integer.parseInt(String.valueOf(ano)));
		try {
			return query.getResultList();
		} catch (NoResultException e) {
			return null;
		}
	}	
	
	@SuppressWarnings("unchecked")
	public List<Projeto> consultarProjetosVinculadosAoFuncionario(Long idFuncionario) {
		Query query = entityManager.createNamedQuery("Projeto.consultaProjetosVinculadosAoFuncionario");
		query.setParameter("idFuncionario", idFuncionario);
		try {
			return query.getResultList();
		} catch (NoResultException e) {
			return null;
		}
	}
	
	@SuppressWarnings("unchecked")
	public List<Projeto> consultarProjetosDesvinculadosAoFuncionario(Long idFuncionario) {
		Query query = entityManager.createNamedQuery("Projeto.consultaProjetosDesvinculadosAoFuncionario");
		query.setParameter("idFuncionario", idFuncionario);
		try {
			return query.getResultList();
		} catch (NoResultException e) {
			return null;
		}
	}
	
}